package tour.board.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import tour.board.dao.BoardDAO;
import tour.board.to.Board;
import tour.board.to.PagingBean;
import board.util.Utilities;

@Service
public class BoardServiceImpl implements BoardService {
	
	@Autowired
	private BoardDAO boardDAO;
	

	public void setBoardDAO(BoardDAO boardDAO) {
		this.boardDAO = boardDAO;
	}

	
	@Override
//	글입력 처리를 하는 메소드
	public void writeContent(Board board) throws SQLException{
		//1. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		String writeDate = Utilities.getNow();
		String c = Utilities.changeContentForDB(board.getContent());
		board.setWritedate(writeDate);
		board.setContent(c);
		//2. DAO를 이용해 글을 DB에 등록한다.
		boardDAO.insertContentForNewCount(board);
		
	}
	@Override
//	하나의 게시물을 조회하는 메소드
	public Board getContentByNO(int no) throws SQLException{
		//1. DAO의 메소드를 이용해 조회수를 1 증가 시킨다.
		boardDAO.updateViewCount(no);
		//2. DAO의 메소드를 이용해 글 정보 조회
		Board board = boardDAO.selectContentByNO(no);
		//3. 조회한 글 정보의 writedate를 yyyy.MM.dd HH:mm:ss 형식으로 변경 후 return
		board.setWritedate(Utilities.changeDayTimeFormat(board.getWritedate()));
		return board;
	}
	@Override
//	답변 폼이나 수정폼을 위해 하나의 게시물을 조회하는 메소드
//	getContentByNO() 와 비교해 조회수 증가를 시키지 않는다.
	public Board getContentByNoForForm(int no) throws SQLException{
		//1. no값으로 글 조회
		Board board = boardDAO.selectContentByNO(no);
		//2. content를 textarea용으로 변경
		board.setContent(Utilities.changeContentForTextArea(board.getContent()));
		return board;
	}
	@Override
//	게시물을 수정 처리하는 메소드
	public void modifyContent(Board board) throws SQLException{
//		1. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		board.setContent(Utilities.changeContentForDB(board.getContent()));
		board.setWritedate(Utilities.getNow());
//		2. DAO 메소드를 이용해 수정 처리
		boardDAO.updateContent(board);
		
	}
	@Override
//	한개의 게시물을 삭제 처리하는 메소드
	public void deleteContentByNO(int no) throws SQLException{
		boardDAO.deleteContentByNO(no);
	}
	@Override
//	답변 처리하는 메소드.
	public void replyContent(Board board) throws SQLException{
//		1. DAO의 메소드를 이용해 DB에 같은 refamily의 게시물들 중 답변하고자하는 글의 restep 보다 큰 게시물들의 restep들을 1씩 증가시킨다.
		boardDAO.updateRestep(board.getRefamily(), board.getRestep());
//		2. 등록하려는 게시물 데이터(매개변수로 받은 board)의 restep, relevel을 1 증가시킨다. - board가 가지고 있는 것은 원본글의 값이므로 자신의 값으로 변경하는 것.
		board.setRestep(board.getRestep()+1);
		board.setRelevel(board.getRelevel()+1);
//		3. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		board.setWritedate(Utilities.getNow());
		board.setContent(Utilities.changeContentForDB(board.getContent()));
//		4. DAO의 메소드를 이용해 글을 DB에 넣는다.
		boardDAO.insertContentForReply(board);
		
	}
	@Override
//	전체 글 조회 처리하는 메소드 - 페이징 처리 안할 경우 호출 될 메소드
	public ArrayList<Board> getBoardAllList() throws SQLException{
//		1. DAO의 메소드를 이용해 전체 글내용을 ArrayList로 조회
		ArrayList<Board> list = boardDAO.selectBoardAllList();
//		2. 조회한 ArrayList 안의 각 게시물들의 writedate를 yyyy.mm.dd 형태로 변경
		for(Board board:list){
			board.setWritedate(Utilities.changeDayFormat(board.getWritedate()));
		}
		return list;
	}

	@Override
//	페이징 처리 목록 조회 메소드.
//	조회한 게시물들(ArrayList)와 페이징 처리를 위한 PagingBean의 객체를 생성해 Map에 넣어 return 처리한다.
	public Map getBoardListByPage(int page) throws SQLException{
		HashMap map = new HashMap();
//		1. DAO메소드를 이용해 매개변수로 받은 페이지에 보여줄 게시물들을 ArrayList로 조회
		System.out.println(page);
		ArrayList<Board> list = boardDAO.selectBoardListByPage(page);
		
//		2. 조회한 ArrayList 안의 각 게시물들의 writedate를 yyyy.mm.dd 형태로 변경
		for(Board board:list){
			board.setWritedate(Utilities.changeDayFormat(board.getWritedate()));
		}
		map.put("list", list);
//		3. PagingBean객체를 생성 ( 필요 정보 : 전체 게시물의 개수, 보고자 하는 페이지 번호)
//		3-1 : DAO의 메소드를 이용해 전체 게시물 수 조회
		int totalContent = boardDAO.selectTotalContent();
//		3-2 : PaginBean 객체 생성
		PagingBean pagingBean = new PagingBean(totalContent, page);
		map.put("pagingBean", pagingBean);
		return map;
	}


	@Override
	public ArrayList findTitle(String find) {
		return boardDAO.findTitle(find);
	}


	@Override
	public ArrayList mainList() {
		return boardDAO.mainList();
	}
}






